Entity Framework 是一個 ORM(Object Relational Mapping)框架,可以大幅減少開發時期大量的撰寫資料庫語法進行資料存取,並且能透過強型別來取得與操作物件資料。
Entity Framework Core (以下簡稱EF Core) 是2016年微軟將Entity Framework 6 重寫,大部分 APIs 都跟 Entity Framework 6 一模一樣
今天就來介紹 ASP.NET Core 使用 EF Core 來存取 Mariadb(MySQL)資料庫
EF Core 有提供兩種開發方式 DB First 與 Code First
本篇將以 DB First 為主,介紹如何搭配EF Core 存取現有的資料庫
首先要先安裝 dotnet ef 的全域工具,才能使用dotnet ef的指令dotnet tool install --global dotnet-ef
接著我們在現有的ASP.NET Core專案底下開啟 terminal 並執行以下指令用來安裝EF Core的nuget套件
dotnet add package Pomelo.EntityFrameworkCore.MySql
(資料庫的Provider,用來與相對性的資料庫溝通)dotnet add package Microsoft.EntityFrameworkCore.Design
(沒有安裝無法透過cli 使用資料庫產生實體)
如果想使用其他資料庫,可以參考其他EF Core資料庫提供者
安裝完之後要透過以下指令來透過資料庫產生實體dotnet ef dbcontext scaffold "server=localhost;Port=3306;Database=Blog; User=root;Password=test1234;" "Pomelo.EntityFrameworkCore.MySql" -o ./Models -c BlogContext -f
指令說明:
dotnet ef dbcontext scaffold "<連線字串>" "<使用的資料庫提供者套件>" -o<是否要輸出在另外一個資料夾> <輸出的資料夾> -c <名稱Context> -f
-o 與輸出資料夾沒有填的話,會在當前目錄產生檔案
-c 與名稱Context沒有填的話,會以Database的名稱作為DbContext名稱
-f 則是宣告要複寫原有檔案
更詳細內容可參考官方文件
注意事項:要在專案可以成功建置的情況下才能下這個指令,如果專案內有錯誤的情況下輸入指令則會顯示Build failed
以上指令輸入完畢之後就會在 Models目錄中看到產生出來的類別
接著我們在 Startup中註冊BlogContext
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<BlogContext>();
services.AddControllers();
}
註冊之後就可以在其他類別內注入BlogContext並使用了
private readonly BlogContext _db;
public SampleController(BlogContext dbContext)
{
_db = dbContext
}
接著下面的範例就使用注入的BlogContext,來做EF Core的基礎資料操作
基礎操作 新增資料
var post = new Post {
Url = "",
Title = "EF Core",
Read = 0
};
_db.Post.Add(post);
_db.SaveChanges();
基礎操作 查詢資料
var id = 1;
var post = _db.Post.Find(id);
var posts = _db.Post.Where(p ⇒ p.Read > 10).OrderBy(p ⇒ p.id)
基礎操作 更新資料
var post = _db.Post.Find(1);
post.Url = "http://google.com";
_db.SaveChanges();
基礎操作 刪除資料
var post = db.Post.Find(1);
db.Post.Remove(post);
db.SaveChanges();
上述範例可看到,EF Core 可透過Linq的語法對資料庫作查詢
EF Core會將Linq的語法透過 資料庫提供者(Database Providers) 解析成SQL語法並執行
呼叫 LINQ 運算子時,只會在記憶體中建立一個表達查詢的物件
只有在取得查詢結果時,才會將產生的 SQL 傳送到資料庫執行,例如:
正確的使用LINQ To SQL 與否對於效能上的差異會非常大,所以上述的重點還是得非常謹慎去使用的。
下一篇將會介紹使用EF Core Code First的方式進行資料庫轉移及版控。
相關連結
官方文件